Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Découpe la page détail des indicateurs avec des onglets #3521

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

mariheck
Copy link
Contributor

Ticket : https://www.notion.so/accelerateur-transition-ecologique-ademe/Refonte-Onglets-page-indicateur-commune-1606523d57d780539af7d93421cdde37?pvs=4

  • Onglets Données / Sous indicateurs / Actions des référentiels liées / Fiches des plans liées
  • L'onglet données contient le graphe, le tableau, et les différents champs de personnalisation (certains seront ensuite déplacés à la refonte du header)
  • Les sous-indicateurs ne suivent pas encore la maquette, la mise en forme utilisée en prod a été conservée
  • Pas de grosse modification sur l'onglet actions, simple déplacement de la liste des cartes
  • L'onglet fiches permet maintenant de rechercher, de trier, et de faire des actions groupées (réutilisation du composant fait pour la page toutes les fiches actions)

Copy link

@mariheck mariheck force-pushed the TET-4241/onglets-indicateurs branch from c4273ea to ac45a2d Compare January 13, 2025 14:43
Copy link
Contributor

@farnoux farnoux left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍
(Et merci pour la petite description contextuelle super claire 👌)

<Tab label={`${enfants.length} Sous indicateurs`}>
<SousIndicateurs definition={definition} enfantsIds={enfants} />
</Tab>
) : undefined}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi mettre undefined plutôt que rien ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si je fais un simple condition === true && <Tab> ... </Tab>, je vais avoir une erreur du composant Tabs car il reçoit des enfants de type Element | boolean au lieu de Element | undefined. Et si j'écris quelque chose comme condition === true ? <Tab> ... </Tab> : <></> l'affichage des onglets est cassé avec un onglet vide qui apparait.

Comment on lines +59 to +82
{isDeleteModalOpen && (
<Modal
openState={{
isOpen: isDeleteModalOpen,
setIsOpen: setIsDeleteModalOpen,
}}
title="Suppression de l'indicateur"
subTitle={definition.titre}
description="Êtes-vous sûr de vouloir supprimer cet indicateur personnalisé ? Vous perdrez définitivement les données associées à cet indicateur."
renderFooter={({ close }) => (
<ModalFooterOKCancel
btnCancelProps={{
onClick: () => close(),
}}
btnOKProps={{
'aria-label': 'Supprimer',
children: 'Supprimer',
onClick: () => {
deleteIndicateurPerso();
close();
},
}}
/>
)}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il me semble qu'on gère les modales comme tu as fait quasiment partout dans l'app, mais en terme d'architecture de composants, une suggestion serait de sortir la modale dans son propre composant indicateur.delete-modale.tsx qui contiendrait son state d'affichage ainsi que son hook de logique de suppression useDeleteIndicateurPerso.

Ça permettrait d'être plus modulaire, et de moins polluer et rendre plus lisible le composant parent.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je suis d'accord avec toi. Sur cette branche je me suis contentée de redécouper la page. Mais j'ai en effet extrait la modale dans son composant dédié dans la branche de refonte du header (qui viendra après).

@@ -23,6 +23,7 @@ import FilterBadges, {
CustomFilterBadges,
useFiltersToBadges,
} from '@/app/ui/shared/filters/filter-badges';
import _ from 'lodash';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Plutôt utiliser es-toolkit que lodash, il y a la même fonction isEqual.

L'idée à terme c'est de supprimer totalement tous les endroits où on utilise lodash en faveur de es-toolkit, plus light et plus performant.

filtres: Filtre;
customFilterBadges?: CustomFilterBadges;
resetFilters?: () => void;
maxNbOfCards?: number;
sortSettings?: SortFicheActionSettings;
enableGroupedActions?: boolean;
isReadOnly?: boolean;
containeClassName?: string;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

containerClassName ?

Comment on lines 161 to 164
if (!_.isEqual(filtres, filtresLocal.current)) {
filtresLocal.current = filtres;
setCurrentPage(1);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi cette gestion du filtresLocal en plus de filtre ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le fait d'avoir une copie de filtres en local me permet de comparer les filtres en props avec la valeur précédente. Etant donné que filtres est un objet, le useEffect seul ne suffit pas, et enclenche des rerender non souhaités.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants